﻿using System.Collections.Generic;
using Azure.QPCR;
using Azure2Java.QPCRAdapter.Adapter.Entity;

namespace Azure2Java.QPCRAdapter.Adapter {

    /**
     * @author zy gws ssc
     * @date 18.12.22
     * @update 19.12.06
     * @decription DataProcesser代理类
     */
    public class DataProcesserAdapter {

        public DataProcesser DataProcesser;

        public DataProcesserAdapter() {
            DataProcesser = new DataProcesser();
        }

        public DataProcesserAdapter(DataProcesser DataProcesser) {
            this.DataProcesser = DataProcesser;
        }

        /**
         * 位于 namespace Azure.QPCR 中 DataProcesser 文件下，APD 文件处理后所有的溶解曲线数据
         * **/
        public MeltingDataBean[] getAllMeltingData() {
            List<MeltingData> allMeltingData = DataProcesser.AllMeltingData;
            MeltingDataBean[] meltingDataAdapters = new MeltingDataBean[allMeltingData.Count];
            for(int i = 0; i < allMeltingData.Count; i++) {
                meltingDataAdapters[i] = new MeltingDataBean(allMeltingData[i]);
            }
            return meltingDataAdapters;
        }

        /**
         * 位于 namespace Azure.QPCR 中 DataProcesser 文件下，APD 文件载入后所有的步骤采集数据
         * 外部 List 是步骤目前 QPCR 只能最大设定30步
         * 所有外部 List 恒定大小为 30；内部的 List 是循环
         * 其打下决定于采集了多少循环
         */
        /**
         * 此处需要注意：因为 jni4net 不能解析C#的二维数组
         * 我对 List<List<ExperimentalData>> 这个二维集合做了如下的封装：
         * @delete 新建了一个实体类：ExperimentalDataAdapters 里面封装了一个 ExperimentalDataAdapter[]
         *         这样做就把 List<List<ExperimentalData>> 转化成了一个 ExperimentalDataAdapters[]
         * @new 将二维数组展开成一维数组，ExperimentalData 中有 step 和 cycle 数
         * 
         * ExperimentalDataAdapters 类封装在了 Azure2Java.QPCRAdapter.Arrays 中
         */
        public ExperimentalDataBean[] getAllExperimentalData() {
            List<List<ExperimentalData>> allRunningExperimentalData = DataProcesser.AllExperimentalData;
            int count = allRunningExperimentalData.Count, length = 0, index = 0;
            for(int i = 0; i < allRunningExperimentalData.Count; i++) 
                length += allRunningExperimentalData[i].Count;

            ExperimentalDataBean[] experimentalDataAdapter = new ExperimentalDataBean[length];

            for(int i = 0; i < allRunningExperimentalData.Count; i++) {
                int _count = allRunningExperimentalData[i].Count;
                for(int j = 0; j < _count; j++) {
                    experimentalDataAdapter[index++] = new ExperimentalDataBean(allRunningExperimentalData[i][j]);
                }
            }
            return experimentalDataAdapter;
        }

        /**
         * 位于namespace Azure.QPCR中DataProcesser文件下，APD文件载入后当前APD文件使用的运行程序
         */
        public ProgramBean getDataProgram() {
            return new ProgramBean(DataProcesser.DataProgram);
        }

        public void setDataProgram(ProgramBean programAdapter) {
            DataProcesser.DataProgram = programAdapter.Program;
        }

        public byte[] getAZDFileArray() {
            return DataProcesser.AZDFileArray;
        }

        public void setAZDFileArray(byte[] azdFileArray) {
            DataProcesser.AZDFileArray = azdFileArray;
        }

        public DyeDictionary[] getDyeList() {
            List<DyeDictionary> dyeList = new List<DyeDictionary>();
            foreach(var list in DataProcesser.DyeList) {
                dyeList.Add(new DyeDictionary(list.Key, list.Value.ToArray()));
            }
            return dyeList.ToArray();
        }

        public DyesCrosstalkCoefficientsDictionary[] getDyeCrosstalkCoefficients() {
            List<DyesCrosstalkCoefficientsDictionary> dyeCrosstalkCoefficients = new List<DyesCrosstalkCoefficientsDictionary>();
            foreach(var list in DataProcesser.DyesCrosstalkCoefficients) {
                dyeCrosstalkCoefficients.Add(new DyesCrosstalkCoefficientsDictionary(list.Key, list.Value.ToArray()));
            }
            return dyeCrosstalkCoefficients.ToArray();
        }

        //载入APD文件
        public bool fromFile(string path) {
            return DataProcesser.FromFile(path);
        }

        //将溶解曲线数据导出为CSV格式
        public bool meltingData2Csv(string savePath) {
            return DataProcesser.MeltingDataToCsv(savePath);
        }

        //将实验步骤数据导出为CSV格式
        public bool experimentalData2Csv(string savePath) {
            return DataProcesser.ExperimentalDataToCsv(savePath);
        }

        //将实验信息数据导出为txt文本文档，其内容为JSON，version为PC软件版本
        public void experimentalInfo2Json(string savePath, string version) {
            DataProcesser.ExperimentalInfoToJson(savePath, version);
        }
    }
}
